package Modulos;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import Entidades.EntidadePreco;
import Entidades.EntidadeVenda;
import Entidades.EntidadeVendedor;

public class ModuloCalculaComissoes {
	public static List<String[]> totaisComissaoVenda = new ArrayList<String[]>();
	private static Double valorComissao = 0.0;
	private static Double valorVenda = 0.0;
	private static Map<String,EntidadeVendedor> vendedores = ModuloRecuperaItens.getVendedores();
	
    private static void _calculaComissaoPorAnoMes(int quantidade, double preco){
    	valorVenda += quantidade * preco;
	}
    
    private static void verificaDataVingencia(int vingenciaMes, int vingenciaAno, int vendaMes, int vendaAno){
    	if(preco.getDataDeVingencia().YEAR <= venda.getData().YEAR){
			if(preco.getDataDeVingencia().MONTH <= venda.getData().MONTH){	
				_calculaComissaoPorAnoMes(venda.getQuantidade(),preco.getPreco());
			}
		}
    }
    
    private static void percorreListaDePrecos(EntidadeVenda venda){
    	for(EntidadePreco preco : venda.getProduto().getPrecos()){
    		preco.getDataDeVingencia().YEAR <= venda.getData().YEAR
    		preco.getDataDeVingencia().MONTH <= venda.getData().MONTH
    		verificaDataVingencia(preco);
		}
    }
    
    private static void percorreListaDeVendedores(int ano, int mes){
		for (Map.Entry<String, EntidadeVendedor> vendas : vendedores.entrySet()) {			
			percorreListaDeVendas(vendas, ano, mes);
		}
    }
    
    public static void verificaDataValida(int mesDaVenda, int anoDaVenda, int mes, int ano){
		if((mesDaVenda == mes)&&(anoDaVenda == ano)){
			_calculaComissaoPorAnoMes(venda);
		}
    }
     
    private static void percorreListaDeVendas(Map.Entry<String, EntidadeVendedor> vendas, int mes, int ano){
    	zeraValores();
    	for(EntidadeVenda venda : vendas.getValue().getVendas()){
    		int mesDaVenda = venda.getData().get(venda.getData().DAY_OF_WEEK);
    		int anoDaVenda = venda.getData().get(venda.getData().YEAR);
			verificaDataValida(mesDaVenda, anoDaVenda, mes, ano);
		}
    	valorComissao = vendas.getValue().getCategoria().calcularComissao(valorVenda);
    	configuraListaUtilizadaPelaTabela(vendas.getValue().getNome(), String.valueOf(valorVenda).toString(),  String.valueOf(valorComissao).toString());
    }
    
    private static void configuraListaUtilizadaPelaTabela(String valorPrimeiraColuna, String valorSegundaColuna, String valorTerceiraColuna){
    	String[] arr = new String[3];
		arr[0] = valorPrimeiraColuna;
		arr[1] = valorSegundaColuna;
		arr[2] = valorTerceiraColuna;
		totaisComissaoVenda.add(arr);
    }
    
    private static void limpaLista(){
    	totaisComissaoVenda = new ArrayList<String[]>();
    }
    
    private static void zeraValores(){
    	valorComissao = 0.0;
		valorVenda = 0.0;
    }
	
	public static void calculaComissao(int ano, int mes){
		limpaLista();
    	percorreListaDeVendedores(ano, mes);
		
		
		totaisComissaoVenda = new ArrayList<String[]>();
		for (Map.Entry<String, EntidadeVendedor> v : vendedores.entrySet()) {
			valorComissao = 0.0;
			valorVenda = 0.0;
			for(EntidadeVenda venda : v.getValue().getVendas()){
				int m = venda.getData().get(venda.getData().DAY_OF_WEEK);
				int a = venda.getData().get(venda.getData().YEAR);
				if((m == mes)&&(a == ano)){
					for(EntidadePreco preco : venda.getProduto().getPrecos()){
						if(preco.getDataDeVingencia().YEAR <= venda.getData().YEAR){
							if(preco.getDataDeVingencia().MONTH <= venda.getData().MONTH){	
								valorVenda += venda.getQuantidade()*preco.getPreco();
							}
						}
					}
				}	
			}
			
			valorComissao = v.getValue().getCategoria().calcularComissao(valorVenda);
			
			String[] arr = new String[3];
			arr[0] = v.getValue().getNome();
			arr[1] = String.valueOf(valorVenda).toString();
			arr[2] = String.valueOf(valorComissao).toString();
			totaisComissaoVenda.add(arr);
		}
	}
    
    public static void calculaComissao(int anoInicial, int mesInicial, int anoFinal, int mesFinal){
    	totaisComissaoVenda = new ArrayList<String[]>();
    	for (Map.Entry<String, EntidadeVendedor> v : vendedores.entrySet()) {
    		valorComissao = 0.0;
			valorVenda = 0.0;
			for(EntidadeVenda venda : v.getValue().getVendas()){
				int m = venda.getData().get(venda.getData().MONTH);
				int a = venda.getData().get(venda.getData().YEAR);
				if(((m >= mesInicial)&&(m <= mesFinal))&&((a >= anoInicial)&&(a <= anoFinal))){
					for(EntidadePreco preco : venda.getProduto().getPrecos()){
						if(preco.getDataDeVingencia().YEAR <= venda.getData().YEAR){
							if(preco.getDataDeVingencia().MONTH <= venda.getData().MONTH){	
								valorVenda += venda.getQuantidade()*preco.getPreco();
							}
						}
					}
				}
			}
			
			valorComissao = v.getValue().getCategoria().calcularComissao(valorVenda);
			
			String[] arr = new String[3];
			arr[0] = v.getValue().getNome();
			arr[1] = String.valueOf(valorVenda).toString();
			arr[2] = String.valueOf(valorComissao).toString();
			totaisComissaoVenda.add(arr);
		}
    }
    
    public static void calculaComissao(int anoInicial, int mesInicial, int anoFinal, int mesFinal, int total){
    	totaisComissaoVenda = new ArrayList<String[]>();
    	for (Map.Entry<String, EntidadeVendedor> v : vendedores.entrySet()) {
    		valorComissao = 0.0;
			valorVenda = 0.0;
			//int total = 0;
			for(EntidadeVenda venda : v.getValue().getVendas()){
				int m = venda.getData().get(venda.getData().DAY_OF_WEEK);
				int a = venda.getData().get(venda.getData().YEAR);
				if(((m >= mesInicial)&&(a >= anoInicial))||((m <= mesFinal)&&(a <= mesInicial))){
					for(EntidadePreco preco : venda.getProduto().getPrecos()){
						if(preco.getDataDeVingencia().YEAR <= venda.getData().YEAR){
							if(preco.getDataDeVingencia().MONTH <= venda.getData().MONTH){	
								valorVenda += venda.getQuantidade()*preco.getPreco();
								total++;
							}
						}
					}
				}	
			}
			
			v.getValue().getCategoria().calcularComissao(valorVenda);
			
			double comissao = 0.0;
			
			int diffYear = anoFinal - anoInicial;
			int mesesTotaisPeriodo = diffYear * 12 + mesFinal - mesInicial;
			
			double mediaComissao = comissao/mesesTotaisPeriodo;
			
			double mediaVendas = total/mesesTotaisPeriodo;
			
			String[] arr = new String[3];
			arr[0] = v.getValue().getNome();
			arr[1] = String.valueOf(mediaVendas).toString();
			arr[2] = String.valueOf(mediaComissao).toString();
			totaisComissaoVenda.add(arr);
		}
    }
}
